package org.seefly.iprint.entity;

import lombok.Data;
import org.seefly.iprint.annotation.EchartsAnnotation;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * 用于Echarts的数据转换，完成剩余操作
 * @author liujianxin 一个热衷于造工具，钻牛角尖的智障
 * @date  2018年4月6日 下午6:07:09
 * @version 1.0.0
 */
@Data
public class SalesDataMap {

    @SuppressWarnings("rawtypes")
    private Map<String, List> map = new HashMap<>();
    

    @SuppressWarnings("rawtypes")
    public Map<String, List> getMap() {
        return map;
    }


    /**
     * echarts插件需要数据进行图形渲染，需要两个数据分别是List<x> x轴,List<xValue> x轴的值
     * 但是通过数据库查询出来的结果是一条记录对应一个pojo，多条记录就是List<entity>
     * 每个pojo中含有两个属性一个是x轴，一个是x轴的值， 所以需要进行转换
     * 这里使用反射将List<entity> 转换成两个List，即一个是x轴集合，一个是x轴值集合；
     * 过程是，将List<entity>中所有的pojo遍历一遍，将每个pojo中的x轴取出统一放入List<x>中，每个Pojo中x轴的值取出统一放入List<xValue>中；
     * 
     * @param fileName
     *            list泛型中所需要转换的属性名称
     * @param list
     *            需要进行上述转换的pojo集合
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public void addAsList(List list) throws Exception {
        List<Object> valueList = null;
        if (list == null || list.size() < 1) {
            throw new NullPointerException("SalesDataMap.add(list)中list空指针");
        }
        // 获取集合中pojo的所有属性
        Field[] fields = list.get(0).getClass().getDeclaredFields();
        EchartsAnnotation annotation = null;
        //遍历每个属性
        for (Field f : fields) {
            annotation = f.getAnnotation(EchartsAnnotation.class);
            //判断该属性上是否有指定注解
            if (annotation != null) {
                //有注解则说明该属性需要转换
                f.setAccessible(true);
                valueList = new ArrayList<>();
                //使用该属性去获取list集合每个Pojo中的该属性的值，并放入集合中
                for(Object o : list) {
                    valueList.add(f.get(o));
                }
                //将属性名作为key，该属性的对应的集合作为value放入map
                this.map.put(f.getName(), valueList);
            }
        }

    }
    
    @SuppressWarnings("rawtypes")
    public void addAsMap(List list,String propName) {
        this.map.put(propName, list);
    }

}
